﻿--[[
class Vector:
可伸缩数组容器
--]]

-- class
Vector = DefineClass(
{
    _size =0;
});

--nil数组
Vector.Nil = nil;

--创建一个空数组对象
function Vector:new()
	return New(self);
end

--返回：数组长度
function Vector:Size()
	return self._size;
end

--获取给定索引的元素
--i: 索引
--返回：元素，索引无效就返回nil
function Vector:At(i)
	return self[i];
end

--查找给定元素所在的位置（从头开始查找，一旦找到就返回）
--a: 待查找的元素
--返回: 给定元素索引（第一个找到的索引），如果没有找到，返回0
function Vector:IndexOf(a)
	local i = 1;
	while i <= self._size do
		if self[i] == a then
			return i;
		end
		i = i +1;
	end
	return 0;
end

--查找满足给定条件元素所在的位置（从头开始查找，一旦找到就返回）
--funcObj: 待满足的条件函数
--返回: 给定元素索引（第一个找到的索引），如果没有找到，返回0
function Vector:IndexOfIF(funcObj)
    local i = 1;
	while i <= self._size do
		if funcObj(self[i]) == true then
			return i;
		end
		i = i +1;
	end
	return 0;
end

--查找给定元素所在的位置（从末尾开始查找，一旦找到就返回）
--a: 待查找的元素
--返回: 给定元素索引（倒序查找），如果没有找到，返回0
function Vector:LastIndexOf(a)
	local i = self._size;
	while i > 0 do
		if self[i] == a then
			return i;
		end
		i = i -1;
	end
	return 0;
end

--在数组末尾加入元素
--a: 待加入的元素
function Vector:PushBack(a)
	self._size = self._size + 1;
	self[self._size] = a;
end

--在数组开头加入元素
--a: 待加入的元素
function Vector:PushFront(a)
	local i;
	for i=self._size, 1, -1 do
		self[i +1] = self[i];
	end
	self[1] = a;
	self._size = self._size +1;
end

--删除数组末尾元素
--返回: 被删除的元素，如果之前数组为空，返回nil
function Vector:PopBack()
	if self._size == 0 then
		return nil;
	end
	local ret = self[self._size];
	self[self._size] = nil;
	self._size = self._size - 1;
	return ret;
end

--删除数组开头元素
--返回: 被删除的元素，如果之前数组为空，返回nil
function Vector:PopFront()
	if self._size == 0 then
		return nil;
	end
	local ret = self[1];
	local i = 2;
	while i <= self._size do
		self[i -1] = self[i];
		i = i +1;
	end
	self[self._size] = nil;
	self._size = self._size - 1;
	return ret;
end

--在数组给定索引位置插入给定元素
--a: 待插入元素
--index: 数组索引位置，如果索引小于等于0，插入到开头；如果索引大于数组长度，插入到末尾
function Vector:Insert(a, index)
	if index <= 1 then 
		self:PushFront(a);
		return;
	end
	if index > self._size then
		self:PushBack(a);
		return;
	end
	
	local i;
	for i=self._size, index, -1 do
		self[i +1] = self[i];
	end
	self[index] = a;
	self._size = self._size +1;
end

--在数组末尾添加table表示的数组
--ary: 待添加的数组
function Vector:AppendArray(ary)
    if ary == nil then
        return;
    end
    for i=1, #ary do
        local elm = ary[i];
        if elm ~= nil then
            self:PushBack(elm);
        end
    end
end

--在数组内替换元素
--a: 待加入的元素
--index: 被删除元素所在的索引
function Vector:ReplaceAt(a, index)
	self[index] = a;
end


--删除数组中给定索引的元素
--index: 被删除元素所在的索引
--返回: 被删除的元素，如果索引无效，返回nil
function Vector:RemoveAt(index)
	if index < 1 or index > self._size then
		return nil
	end
	local ret = self[index];
	local i = index +1;
	while i <= self._size do
		self[i -1] = self[i];
		i = i +1;
	end
	self[self._size] = nil;
	self._size = self._size - 1;
	return ret;
end

--删除数组中给定索引的元素
--a: 待删除的元素
--返回: 被删除的元素之前的索引，如果没有找到，返回0
function Vector:Remove(a)
	local ret = self:IndexOf(a);
	self:RemoveAt(ret);
	return ret;
end

--清空数组
function Vector:Clear()
	local i = 1;
	while i <= self._size do
		self[i] = nil;
		i = i +1;
	end
	self._size = 0;
end

--克隆当前数组
--return: 新数组
function Vector:Clone()
	local v = Vector:new();
	self:CopyTo(v);
	return v;
end

--将当前数组内容拷贝到目标数组（拷贝前目标数组会先被清空）
--v: 目标数组
function Vector:CopyTo(v)
	v:Clear();
	local i = 1;
	while i <= self._size do
		v[i] = self[i];
		i = i+1;
	end
	v._size = self._size;
end

function Vector:SortIf(funcObj)
    SortIf(self,funcObj);
end

function Vector:FindIf(funcObj)
    return FindIf(self,funcObj);
end

function Vector:RemoveIf(funcObj)
   local ret;
   self._size, ret = RemoveIf(self,funcObj);
   return self._size, ret;
end

--生成一个Table返回
function Vector:Vector2Table()
    local returnTable = {};
    for index = 1,self:Size() do
        returnTable[index] = self:At(index);
    end
    return returnTable;
end